﻿#region Header
// Copyright 2007-2011, Jerónimo Milea
// 
// This file is part of NetJsWire.
// 
//     NetJsWire is free software: you can redistribute it and/or modify
//     it under the terms of the GNU General Public License as published by
//     the Free Software Foundation, either version 3 of the License, or
//     (at your option) any later version.
// 
//     NetJsWire is distributed in the hope that it will be useful,
//     but WITHOUT ANY WARRANTY; without even the implied warranty of
//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//     GNU General Public License for more details.
// 
//     You should have received a copy of the GNU General Public License
//     along with NetJsWire.  If not, see <http://www.gnu.org/licenses/>.
#endregion

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.Design.Serialization;
using System.Drawing.Design;
using System.Linq;
using NetJsWire.Lite.CodeDom;
using NetJsWire.Lite.Converters;
using NetJsWire.Lite.Editors;
using NetJsWire.Lite.Serializers;
using Newtonsoft.Json;
using CollectionCodeDomSerializer = NetJsWire.Lite.CodeDom.CollectionCodeDomSerializer;

namespace NetJsWire.Lite.Widgets
{
    [Editor( typeof( ListenersCollectionEditor ), typeof( UITypeEditor ) )]
    //[Serializable]
    [JsonConverter( typeof( ListenerCollectionJsonConverter ) )]
    //[DesignerSerializer( typeof( CollectionCodeDomSerializer ), typeof( CodeDomSerializer ) )]
    public class ListenersCollection : List<Listener>
    {

        public void AddRange( params Listener[] listeners )
        {
            foreach ( var listener in listeners )
            {
                Add( listener );
            }
        }

        public Listener this[ string name ]
        {
            get
            {
                if ( Count == 0 )
                    return null;

                return this.FirstOrDefault( listener => listener.EventName.Equals( name, StringComparison.OrdinalIgnoreCase ) );
            }
            set
            {
                value.EventName = name;
                if ( Contains( value ) )
                {
                    this[ IndexOf( value ) ] = value;
                }
                else
                {
                    Add( value );
                }
            }
        }

        public override string ToString()
        {
            return "Listeners[" + Count + "]";
        }
    }
}